{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Regressão Linear Multivariada - Trabalho\n",
    "\n",
    "__Equipe:__\n",
    "* Sayonara Santos Araújo\n",
    "* Lailson Azevedo do Rego\n",
    "\n",
    "## Estudo de caso: Qualidade de Vinhos\n",
    "\n",
    "Nesta trabalho, treinaremos um modelo de regressão linear usando descendência de gradiente estocástico no conjunto de dados da Qualidade do Vinho. O exemplo pressupõe que uma cópia CSV do conjunto de dados está no diretório de trabalho atual com o nome do arquivo *winequality-white.csv*.\n",
    "\n",
    "O conjunto de dados de qualidade do vinho envolve a previsão da qualidade dos vinhos brancos em uma escala, com medidas químicas de cada vinho. É um problema de classificação multiclasse, mas também pode ser enquadrado como um problema de regressão. O número de observações para cada classe não é equilibrado. Existem 4.898 observações com 11 variáveis de entrada e 1 variável de saída. Os nomes das variáveis são os seguintes:\n",
    "\n",
    "1. Fixed acidity.\n",
    "2. Volatile acidity.\n",
    "3. Citric acid.\n",
    "4. Residual sugar.\n",
    "5. Chlorides.\n",
    "6. Free sulfur dioxide. \n",
    "7. Total sulfur dioxide. \n",
    "8. Density.\n",
    "9. pH.\n",
    "10. Sulphates.\n",
    "11. Alcohol.\n",
    "12. Quality (score between 0 and 10).\n",
    "\n",
    "O desempenho de referencia de predição do valor médio é um RMSE de aproximadamente 0.148 pontos de qualidade.\n",
    "\n",
    "Utilize o exemplo apresentado no tutorial e altere-o de forma a carregar os dados e analisar a acurácia de sua solução. \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Resolução"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from math import sqrt\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from sklearn import preprocessing\n",
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Função para calcular RMSE\n",
    "def rmse_metric(actual, predicted):\n",
    "    sum_error = 0.0\n",
    "    for i in range(len(actual)):\n",
    "        prediction_error = predicted[i] - actual[i]\n",
    "        sum_error += (prediction_error ** 2)\n",
    "        mean_error = sum_error / float(len(actual))\n",
    "    return sqrt(mean_error)\n",
    "\n",
    "# Função de predição dos coeficientes \n",
    "def predict(row, coefficients):\n",
    "    yhat = coefficients[0]\n",
    "    for i in range(len(row)-1):\n",
    "        yhat += coefficients[i+1] * row[i]\n",
    "    return yhat\n",
    "\n",
    "# Função para estimar dos coeficiente com Gradiente Descendente Estocástico\n",
    "def coefficients_sgd(train, l_rate, n_epoch):\n",
    "    #coef = np.random.normal(-20,0, size = len(train[0]))\n",
    "    rmse_list = list()\n",
    "    coef = [0.0 for i in range(len(train[0]))]\n",
    "    print(coef)\n",
    "    print ('Coeficiente Inicial={0}' % (coef))\n",
    "    for epoch in range(n_epoch):\n",
    "        #sum_error = 0\n",
    "        y_pred = list()\n",
    "        for row in train:\n",
    "            yhat = predict(row, coef)\n",
    "            error = yhat - row[-1]\n",
    "            #sum_error += error**2\n",
    "            y_pred.append(yhat)\n",
    "            coef[0] = coef[0] - l_rate * error\n",
    "            for i in range(len(row)-1):\n",
    "                coef[i+1] = coef[i+1] - l_rate * error * row[i]\n",
    "        rmse = rmse_metric(train[-1], y_pred)\n",
    "        rmse_list.append(rmse)\n",
    "        print(('epoch=%d, lrate=%f, error=%.3f' % (epoch, l_rate, rmse)))\n",
    "    return coef, rmse_list"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fixed acidity</th>\n",
       "      <th>volatile acidity</th>\n",
       "      <th>citric acid</th>\n",
       "      <th>residual sugar</th>\n",
       "      <th>chlorides</th>\n",
       "      <th>free sulfur dioxide</th>\n",
       "      <th>total sulfur dioxide</th>\n",
       "      <th>density</th>\n",
       "      <th>pH</th>\n",
       "      <th>sulphates</th>\n",
       "      <th>alcohol</th>\n",
       "      <th>quality</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>7.0</td>\n",
       "      <td>0.27</td>\n",
       "      <td>0.36</td>\n",
       "      <td>20.7</td>\n",
       "      <td>0.045</td>\n",
       "      <td>45.0</td>\n",
       "      <td>170.0</td>\n",
       "      <td>1.0010</td>\n",
       "      <td>3.00</td>\n",
       "      <td>0.45</td>\n",
       "      <td>8.8</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6.3</td>\n",
       "      <td>0.30</td>\n",
       "      <td>0.34</td>\n",
       "      <td>1.6</td>\n",
       "      <td>0.049</td>\n",
       "      <td>14.0</td>\n",
       "      <td>132.0</td>\n",
       "      <td>0.9940</td>\n",
       "      <td>3.30</td>\n",
       "      <td>0.49</td>\n",
       "      <td>9.5</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8.1</td>\n",
       "      <td>0.28</td>\n",
       "      <td>0.40</td>\n",
       "      <td>6.9</td>\n",
       "      <td>0.050</td>\n",
       "      <td>30.0</td>\n",
       "      <td>97.0</td>\n",
       "      <td>0.9951</td>\n",
       "      <td>3.26</td>\n",
       "      <td>0.44</td>\n",
       "      <td>10.1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>7.2</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.32</td>\n",
       "      <td>8.5</td>\n",
       "      <td>0.058</td>\n",
       "      <td>47.0</td>\n",
       "      <td>186.0</td>\n",
       "      <td>0.9956</td>\n",
       "      <td>3.19</td>\n",
       "      <td>0.40</td>\n",
       "      <td>9.9</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>7.2</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.32</td>\n",
       "      <td>8.5</td>\n",
       "      <td>0.058</td>\n",
       "      <td>47.0</td>\n",
       "      <td>186.0</td>\n",
       "      <td>0.9956</td>\n",
       "      <td>3.19</td>\n",
       "      <td>0.40</td>\n",
       "      <td>9.9</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>8.1</td>\n",
       "      <td>0.28</td>\n",
       "      <td>0.40</td>\n",
       "      <td>6.9</td>\n",
       "      <td>0.050</td>\n",
       "      <td>30.0</td>\n",
       "      <td>97.0</td>\n",
       "      <td>0.9951</td>\n",
       "      <td>3.26</td>\n",
       "      <td>0.44</td>\n",
       "      <td>10.1</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   fixed acidity  volatile acidity  citric acid  residual sugar  chlorides  \\\n",
       "0            7.0              0.27         0.36            20.7      0.045   \n",
       "1            6.3              0.30         0.34             1.6      0.049   \n",
       "2            8.1              0.28         0.40             6.9      0.050   \n",
       "3            7.2              0.23         0.32             8.5      0.058   \n",
       "4            7.2              0.23         0.32             8.5      0.058   \n",
       "5            8.1              0.28         0.40             6.9      0.050   \n",
       "\n",
       "   free sulfur dioxide  total sulfur dioxide  density    pH  sulphates  \\\n",
       "0                 45.0                 170.0   1.0010  3.00       0.45   \n",
       "1                 14.0                 132.0   0.9940  3.30       0.49   \n",
       "2                 30.0                  97.0   0.9951  3.26       0.44   \n",
       "3                 47.0                 186.0   0.9956  3.19       0.40   \n",
       "4                 47.0                 186.0   0.9956  3.19       0.40   \n",
       "5                 30.0                  97.0   0.9951  3.26       0.44   \n",
       "\n",
       "   alcohol  quality  \n",
       "0      8.8        6  \n",
       "1      9.5        6  \n",
       "2     10.1        6  \n",
       "3      9.9        6  \n",
       "4      9.9        6  \n",
       "5     10.1        6  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Carregamento do dataset\n",
    "dataset = pd.read_csv(\"winequality-white.csv\", \";\")\n",
    "dataset.head(6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Normalização dos dados\n",
    "min_max_scaler = preprocessing.MinMaxScaler()\n",
    "dataset_scaled = min_max_scaler.fit_transform(dataset)\n",
    "datasetn = pd.DataFrame(dataset_scaled)\n",
    "#datasetn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Divisão do dataset\n",
    "m = np.random.rand(len(datasetn)) < 0.8\n",
    "train = datasetn[m]\n",
    "test = datasetn[~m]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]\n",
      "Coeficiente Inicial={0}\n",
      "epoch=0, lrate=0.000001, error=0.295\n",
      "epoch=1, lrate=0.000001, error=0.292\n",
      "epoch=2, lrate=0.000001, error=0.290\n",
      "epoch=3, lrate=0.000001, error=0.287\n",
      "epoch=4, lrate=0.000001, error=0.285\n",
      "epoch=5, lrate=0.000001, error=0.283\n",
      "epoch=6, lrate=0.000001, error=0.280\n",
      "epoch=7, lrate=0.000001, error=0.278\n",
      "epoch=8, lrate=0.000001, error=0.276\n",
      "epoch=9, lrate=0.000001, error=0.273\n",
      "epoch=10, lrate=0.000001, error=0.271\n",
      "epoch=11, lrate=0.000001, error=0.269\n",
      "epoch=12, lrate=0.000001, error=0.267\n",
      "epoch=13, lrate=0.000001, error=0.264\n",
      "epoch=14, lrate=0.000001, error=0.262\n",
      "epoch=15, lrate=0.000001, error=0.260\n",
      "epoch=16, lrate=0.000001, error=0.258\n",
      "epoch=17, lrate=0.000001, error=0.256\n",
      "epoch=18, lrate=0.000001, error=0.254\n",
      "epoch=19, lrate=0.000001, error=0.252\n",
      "epoch=20, lrate=0.000001, error=0.250\n",
      "epoch=21, lrate=0.000001, error=0.248\n",
      "epoch=22, lrate=0.000001, error=0.247\n",
      "epoch=23, lrate=0.000001, error=0.245\n",
      "epoch=24, lrate=0.000001, error=0.243\n",
      "epoch=25, lrate=0.000001, error=0.241\n",
      "epoch=26, lrate=0.000001, error=0.240\n",
      "epoch=27, lrate=0.000001, error=0.238\n",
      "epoch=28, lrate=0.000001, error=0.236\n",
      "epoch=29, lrate=0.000001, error=0.235\n",
      "epoch=30, lrate=0.000001, error=0.233\n",
      "epoch=31, lrate=0.000001, error=0.231\n",
      "epoch=32, lrate=0.000001, error=0.230\n",
      "epoch=33, lrate=0.000001, error=0.228\n",
      "epoch=34, lrate=0.000001, error=0.227\n",
      "epoch=35, lrate=0.000001, error=0.225\n",
      "epoch=36, lrate=0.000001, error=0.224\n",
      "epoch=37, lrate=0.000001, error=0.223\n",
      "epoch=38, lrate=0.000001, error=0.221\n",
      "epoch=39, lrate=0.000001, error=0.220\n",
      "epoch=40, lrate=0.000001, error=0.219\n",
      "epoch=41, lrate=0.000001, error=0.218\n",
      "epoch=42, lrate=0.000001, error=0.216\n",
      "epoch=43, lrate=0.000001, error=0.215\n",
      "epoch=44, lrate=0.000001, error=0.214\n",
      "epoch=45, lrate=0.000001, error=0.213\n",
      "epoch=46, lrate=0.000001, error=0.212\n",
      "epoch=47, lrate=0.000001, error=0.211\n",
      "epoch=48, lrate=0.000001, error=0.210\n",
      "epoch=49, lrate=0.000001, error=0.209\n",
      "epoch=50, lrate=0.000001, error=0.208\n",
      "epoch=51, lrate=0.000001, error=0.207\n",
      "epoch=52, lrate=0.000001, error=0.206\n",
      "epoch=53, lrate=0.000001, error=0.205\n",
      "epoch=54, lrate=0.000001, error=0.204\n",
      "epoch=55, lrate=0.000001, error=0.203\n",
      "epoch=56, lrate=0.000001, error=0.202\n",
      "epoch=57, lrate=0.000001, error=0.202\n",
      "epoch=58, lrate=0.000001, error=0.201\n",
      "epoch=59, lrate=0.000001, error=0.200\n",
      "epoch=60, lrate=0.000001, error=0.199\n",
      "epoch=61, lrate=0.000001, error=0.199\n",
      "epoch=62, lrate=0.000001, error=0.198\n",
      "epoch=63, lrate=0.000001, error=0.197\n",
      "epoch=64, lrate=0.000001, error=0.197\n",
      "epoch=65, lrate=0.000001, error=0.196\n",
      "epoch=66, lrate=0.000001, error=0.196\n",
      "epoch=67, lrate=0.000001, error=0.195\n",
      "epoch=68, lrate=0.000001, error=0.195\n",
      "epoch=69, lrate=0.000001, error=0.194\n",
      "epoch=70, lrate=0.000001, error=0.194\n",
      "epoch=71, lrate=0.000001, error=0.193\n",
      "epoch=72, lrate=0.000001, error=0.193\n",
      "epoch=73, lrate=0.000001, error=0.193\n",
      "epoch=74, lrate=0.000001, error=0.192\n",
      "epoch=75, lrate=0.000001, error=0.192\n",
      "epoch=76, lrate=0.000001, error=0.192\n",
      "epoch=77, lrate=0.000001, error=0.191\n",
      "epoch=78, lrate=0.000001, error=0.191\n",
      "epoch=79, lrate=0.000001, error=0.191\n",
      "epoch=80, lrate=0.000001, error=0.191\n",
      "epoch=81, lrate=0.000001, error=0.190\n",
      "epoch=82, lrate=0.000001, error=0.190\n",
      "epoch=83, lrate=0.000001, error=0.190\n",
      "epoch=84, lrate=0.000001, error=0.190\n",
      "epoch=85, lrate=0.000001, error=0.190\n",
      "epoch=86, lrate=0.000001, error=0.190\n",
      "epoch=87, lrate=0.000001, error=0.190\n",
      "epoch=88, lrate=0.000001, error=0.189\n",
      "epoch=89, lrate=0.000001, error=0.189\n",
      "epoch=90, lrate=0.000001, error=0.189\n",
      "epoch=91, lrate=0.000001, error=0.189\n",
      "epoch=92, lrate=0.000001, error=0.189\n",
      "epoch=93, lrate=0.000001, error=0.189\n",
      "epoch=94, lrate=0.000001, error=0.189\n",
      "epoch=95, lrate=0.000001, error=0.189\n",
      "epoch=96, lrate=0.000001, error=0.190\n",
      "epoch=97, lrate=0.000001, error=0.190\n",
      "epoch=98, lrate=0.000001, error=0.190\n",
      "epoch=99, lrate=0.000001, error=0.190\n",
      "epoch=100, lrate=0.000001, error=0.190\n",
      "epoch=101, lrate=0.000001, error=0.190\n",
      "epoch=102, lrate=0.000001, error=0.190\n",
      "epoch=103, lrate=0.000001, error=0.190\n",
      "epoch=104, lrate=0.000001, error=0.191\n",
      "epoch=105, lrate=0.000001, error=0.191\n",
      "epoch=106, lrate=0.000001, error=0.191\n",
      "epoch=107, lrate=0.000001, error=0.191\n",
      "epoch=108, lrate=0.000001, error=0.191\n",
      "epoch=109, lrate=0.000001, error=0.192\n",
      "epoch=110, lrate=0.000001, error=0.192\n",
      "epoch=111, lrate=0.000001, error=0.192\n",
      "epoch=112, lrate=0.000001, error=0.192\n",
      "epoch=113, lrate=0.000001, error=0.193\n",
      "epoch=114, lrate=0.000001, error=0.193\n",
      "epoch=115, lrate=0.000001, error=0.193\n",
      "epoch=116, lrate=0.000001, error=0.194\n",
      "epoch=117, lrate=0.000001, error=0.194\n",
      "epoch=118, lrate=0.000001, error=0.194\n",
      "epoch=119, lrate=0.000001, error=0.194\n"
     ]
    }
   ],
   "source": [
    "# Estimativa dos coeficientes\n",
    "learn_rate = 0.000001\n",
    "epoch = 120\n",
    "coefficients, error_list = coefficients_sgd(train.values, learn_rate, epoch)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Coeficientes:  [0.1540845885948926, 0.044640599757629545, 0.028660812120025577, 0.030975476450802196, 0.013331414470033888, 0.015942077967758088, 0.017902361827538835, 0.044850474339379096, 0.019447009511866165, 0.066250591378542403, 0.048560635063046864, 0.067960577686745349]\n"
     ]
    }
   ],
   "source": [
    "print('Coeficientes: ',coefficients)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0,0.5,'RMSE')"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f93661a8438>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(error_list, 'b-')\n",
    "plt.title(\"Regressão Multivariada\")\n",
    "plt.axhline(y=0.148, color='r')\n",
    "plt.xlabel('Época')\n",
    "plt.ylabel(u'RMSE')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A regressão não chegou ao RMSEA de 0.148 de qualidade. A estimativa dos coeficientes com Gradiente Descendente Estocástico se aproximou rapidamente do RMSE esperado na época 83, chegando a 0,195. Contudo, o erro voltou a crescer, mesmo com passo de aprendizagem curto."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
